package manejador;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import persistencia.Conexion;
import entidad.Empleado;

import interfaz.IEntidad;
import interfaz.IManejador;

public class ManejadorDeEmpleado implements IManejador {

	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	private static ManejadorDeEmpleado instancia = null;
	private Empleado empleado = null;
	private List<IEntidad> empleados = null;

	private Conexion conexion = null;

	private ManejadorDeEmpleado() {
		conexion = Conexion.getInstancia();
	}

	public static ManejadorDeEmpleado getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeEmpleado();
		}
		return instancia;
	}

	public int agregarEmpleadoConCelular(IEntidad entidad) {
		int fila = 0;
		empleado = (Empleado) entidad;
		String sql = "INSERT INTO sistema_informacion.empleado (nombre, apellido, sexo, cedula, direccion, telefono, celular, id_role, usuario, clave, estatus) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, empleado.getNombre());
			stmt.setString(2, empleado.getApellido());
			stmt.setString(3, empleado.getSexo());
			stmt.setString(4, empleado.getCedula());
			stmt.setString(5, empleado.getDireccion());
			stmt.setString(6, empleado.getTelefono());
			stmt.setString(7, empleado.getCelular());
			stmt.setInt(8, empleado.getIdRole());
			stmt.setString(9, empleado.getUsuario());
			stmt.setString(10, empleado.getClave());
			stmt.setString(11, empleado.getEstatus());
			fila = stmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}
	
	public int agregarEmpleadoConEmail(IEntidad entidad) {
		int fila = 0;
		empleado = (Empleado) entidad;
		String sql = "INSERT INTO sistema_informacion.empleado (nombre, apellido, sexo, cedula, direccion, telefono, id_role, usuario, clave, estatus, email) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, empleado.getNombre());
			stmt.setString(2, empleado.getApellido());
			stmt.setString(3, empleado.getSexo());
			stmt.setString(4, empleado.getCedula());
			stmt.setString(5, empleado.getDireccion());
			stmt.setString(6, empleado.getTelefono());
			stmt.setInt(7, empleado.getIdRole());
			stmt.setString(8, empleado.getUsuario());
			stmt.setString(9, empleado.getClave());
			stmt.setString(10, empleado.getEstatus());
			stmt.setString(11, empleado.getEmail());
			fila = stmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}
	
	public int agregarEmpleadoConTodo(IEntidad entidad) {
		int fila = 0;
		empleado = (Empleado) entidad;
		String sql = "INSERT INTO sistema_informacion.empleado (nombre, apellido, sexo, cedula, direccion, telefono,celular, id_role, usuario, clave, estatus, email) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, empleado.getNombre());
			stmt.setString(2, empleado.getApellido());
			stmt.setString(3, empleado.getSexo());
			stmt.setString(4, empleado.getCedula());
			stmt.setString(5, empleado.getDireccion());
			stmt.setString(6, empleado.getTelefono());
			stmt.setString(7, empleado.getCelular());
			stmt.setInt(8, empleado.getIdRole());
			stmt.setString(9, empleado.getUsuario());
			stmt.setString(10, empleado.getClave());
			stmt.setString(11, empleado.getEstatus());
			stmt.setString(12, empleado.getEmail());
			fila = stmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}
	
	public int agregar1(IEntidad entidad) {
		int fila = 0;
		empleado = (Empleado) entidad;
		String sql = "INSERT INTO sistema_informacion.empleado (nombre, apellido, sexo, cedula, direccion, telefono,celular, id_role, usuario, clave, estatus, email) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, empleado.getNombre());
			stmt.setString(2, empleado.getApellido());
			stmt.setString(3, empleado.getSexo());
			stmt.setString(4, empleado.getCedula());
			stmt.setString(5, empleado.getDireccion());
			stmt.setString(6, empleado.getTelefono());
			stmt.setString(7, empleado.getCelular());
			stmt.setInt(8, empleado.getIdRole());
			stmt.setString(9, empleado.getUsuario());
			stmt.setString(10, empleado.getClave());
			stmt.setString(11, empleado.getEstatus());
			stmt.setString(12, empleado.getEmail());
			fila = stmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}

	@Override
	public int eliminar(int id) {
		int fila = 0;
		String sql = "DELETE FROM sistema_informacion.empleado WHERE id_empleado = ?;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;
	}

	public int validarLogin(String usuario, String clave) {
		String sql = "SELECT usuario, clave, id_role FROM sistema_informacion.empleado ";
		String usuarioRegistrado = "";
		String claveRegistrada = "";
		int rol;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				usuarioRegistrado = rs.getString("usuario");
				claveRegistrada = rs.getString("clave");
				if (usuario.trim().equalsIgnoreCase(usuarioRegistrado)
						&& clave.trim().equalsIgnoreCase(claveRegistrada)) {
					rol = rs.getInt("id_role");
					return rol;
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}

	public boolean validarUsuario(String usuario) {
		String sql = "SELECT usuario FROM sistema_informacion.empleado ";
		String usuarioRegistrado = "";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				usuarioRegistrado = rs.getString("usuario");
				if (usuario.trim().equalsIgnoreCase(usuarioRegistrado)) {
					return true;
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public List<IEntidad> getEntidad() {
		empleados = new ArrayList<IEntidad>();
		String sql = "SELECT * FROM sistema_informacion.empleado;";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad empleado = new Empleado(rs.getInt("id_empleado"), rs
						.getString("nombre"), rs.getString("apellido"), rs
						.getString("sexo"), rs.getString("cedula"), rs
						.getString("direccion"), rs.getString("telefono"), rs
						.getString("celular"), rs.getInt("id_role"), rs
						.getString("usuario"), rs.getString("clave"), rs
						.getString("estatus"));
				empleados.add(empleado);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return empleados;
	}

	@Override
	public IEntidad getEntidadPorId(int id) {

		String sql = "SELECT * FROM sistema_informacion.empleado WHERE id_empleado="
				+ id;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				empleado = new Empleado(rs.getInt("id_empleado"), rs
						.getString("nombre"), rs.getString("apellido"), rs
						.getString("sexo"), rs.getString("cedula"), rs
						.getString("direccion"), rs.getString("telefono"), rs
						.getString("celular"), rs.getInt("id_role"), rs
						.getString("usuario"), rs.getString("clave"), rs
						.getString("estatus"),rs.getString("email"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return empleado;
	}

	@Override
	public int modificar(IEntidad entidad, int id) {
		int fila = 0;
		empleado = (Empleado) entidad;
		String sql = "UPDATE sistema_informacion.empleado SET nombre = ? , apellido = ?, sexo = ? , cedula = ? , direccion = ? , telefono = ? , celular = ? , id_role = ?,usuario=? ,clave=?,estatus=?, email=? WHERE id_empleado = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, empleado.getNombre());
			stmt.setString(2, empleado.getApellido());
			stmt.setString(3, empleado.getSexo());
			stmt.setString(4, empleado.getCedula());
			stmt.setString(5, empleado.getDireccion());
			stmt.setString(6, empleado.getTelefono());
			stmt.setString(7, empleado.getCelular());
			stmt.setInt(8, empleado.getIdRole());
			stmt.setString(9, empleado.getUsuario());
			stmt.setString(10, empleado.getClave());
			stmt.setString(11, empleado.getEstatus());
			stmt.setString(12,empleado.getEmail());
			stmt.setInt(13, id);
			
			fila = stmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;
	}

	public List<IEntidad> getEntidadDinamica(String parametro) {
		empleados = new ArrayList<IEntidad>();
		String sql = "";
		if (parametro.equals("ACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.empleado WHERE estatus="
					+ "'" + parametro + "'";

		} else if (parametro.equals("INACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.empleado WHERE estatus="
					+ "'" + parametro + "'";

		} else if (parametro.equals("TODOS")) {
			sql = "SELECT * FROM sistema_informacion.empleado";
		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad empleado = new Empleado(rs.getInt("id_empleado"), rs
						.getString("nombre"), rs.getString("apellido"), rs
						.getString("sexo"), rs.getString("cedula"), rs
						.getString("direccion"), rs.getString("telefono"), rs
						.getString("celular"), rs.getInt("id_role"), rs
						.getString("usuario"), rs.getString("clave"), rs
						.getString("estatus"));

				empleados.add(empleado);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return empleados;
	}

	public int cambiarEstatus(int id) {
		int fila = 0;
		empleado = (Empleado) ManejadorDeEmpleado.getInstancia()
				.getEntidadPorId(id);
		String estatus = empleado.getEstatus().equalsIgnoreCase("ACTIVO") ? "INACTIVO"
				: "ACTIVO";
		String sql = "UPDATE empleado SET estatus=? WHERE id_empleado=" + id;
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, estatus);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}

	public List<IEntidad> getProfesoresActivos() {
		empleados = new ArrayList<IEntidad>();
		String sql = "SELECT empleado.*,role.* FROM empleado,role WHERE empleado.id_role=role.id_role AND role.nombre_role='PROFESOR'AND empleado.estatus='ACTIVO';  ";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad empleado = new Empleado(rs.getInt("id_empleado"), rs
						.getString("nombre"), rs.getString("apellido"), rs
						.getString("sexo"), rs.getString("cedula"), rs
						.getString("direccion"), rs.getString("telefono"), rs
						.getString("celular"), rs.getInt("id_role"), rs
						.getString("usuario"), rs.getString("clave"), rs
						.getString("estatus"));
				empleados.add(empleado);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return empleados;
	}

	public int getIdEmpleado(String usuario) {
		int idEmpleado = 0;
		String sql = "SELECT id_empleado FROM empleado WHERE usuario=" + "'"
				+ usuario + "'";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				idEmpleado = rs.getInt("id_empleado");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return idEmpleado;
	}

	@Override
	public int agregar(IEntidad entidad) {
		// TODO Auto-generated method stub
		return 0;
	}

	

}